package br.com.mackinvest.dao;

import static java.lang.System.out;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.TreeMap;

import br.com.mackinvest.constants.Constants;
import br.com.mackinvest.model.Cliente;
import br.com.mackinvest.model.Investimento;
import br.com.mackinvest.model.Transacao;

public class TransacaoMySQLDAO implements GenericDAO<Transacao> {
	private PreparedStatement statement;
	private String query;
	private Connection con;
	
	public TransacaoMySQLDAO() {
		con = DBUtil.getConnection();
	}	
	
	public void salva(Transacao model) {
	 
		query = "INSERT INTO tbTransacao(valor,data,id_cliente,id_investimento) VALUES (?,?,?,?)";
		try
		{
			statement = con.prepareStatement(query);
			statement.setFloat(1, model.getInvestimento().getSaldo());
			statement.setDate(2, (Date) model.getData());
			statement.setInt(3, model.getCliente().getId());
			statement.setInt(4, model.getInvestimento().getId());
			
			statement.executeUpdate();
		}
		catch(SQLException ex)
		{
			out.println(Constants.ERRO_INSERT_NAO_REALIZADO);
			out.println(ex);
		}	
	}
	 
	public void deleta(Transacao model) {
		
		try
		{
			query = "DELETE FROM tbTransacao WHERE id=?";			
			statement = con.prepareStatement(query);
			statement.setInt(1, model.getId());
			statement.executeUpdate();

		}
		catch(SQLException ex)
		{
			out.println(Constants.ERRO_DELETE_NAO_REALIZADO);
			out.println(ex);
		}
	 
	}
	 
	public TreeMap<Integer, Transacao> retornaTodos() {
		
		query = "SELECT * FROM tbTransacao";
		TreeMap<Integer, Transacao> transacoes = new TreeMap<Integer, Transacao>();
		Transacao aux_transacao = null;
		
		try {
			statement = con.prepareStatement(query);
			ResultSet rs = statement.executeQuery();
			while(rs.next()){
				//aux_transacao = new Trans(rs.getInt("id"),rs.getString("nome"));
								
				Investimento relacaoInvestimento = new Investimento();
				relacaoInvestimento.setId( rs.getInt("id") );
				
				Cliente clienteExemplo = new Cliente();
				clienteExemplo.setId( rs.getInt("id_cliente") );
				
				//clienteExemplo.setCliente( );
				
				aux_transacao = new Transacao(rs.getInt("id"),rs.getFloat("valor"),rs.getDate("data"),(new InvestimentoMySQLDAO()).procuraPorExemplo( relacaoInvestimento ),(new ClienteMySQLDAO()).procuraPorExemplo( clienteExemplo ));
				aux_transacao.setPersistido(true);
				
				transacoes.put(aux_transacao.getId(),aux_transacao);
			}		
		} catch (SQLException ex) {
			out.println(Constants.ERRO_REGISTRO_NAO_ENCONTRADO);
			out.println(ex);			
		}
		
		return transacoes;
	}
	 
	public Transacao procuraPorExemplo(Transacao model) {
		query = "SELECT * FROM tbTransacao WHERE id = ?";
		Transacao transacaoRetorno = null;
		try
		{
			statement = con.prepareStatement(query);
			statement.setInt(1, model.getId());
			statement.execute();
			ResultSet rs = statement.getResultSet();
			if(rs.next()){

				Investimento relacaoInvestimento = new Investimento();
				relacaoInvestimento.setId( rs.getInt("id") );
				
				Cliente clienteExemplo = new Cliente();
				clienteExemplo.setId( rs.getInt("id_cliente") );
				
				transacaoRetorno = new Transacao(rs.getInt("id"),rs.getFloat("valor"),rs.getDate("data"),(new InvestimentoMySQLDAO()).procuraPorExemplo( relacaoInvestimento ),(new ClienteMySQLDAO()).procuraPorExemplo( clienteExemplo ));
				transacaoRetorno.setPersistido(true);
			}
		}
		catch(SQLException ex)
		{
			System.out.println(Constants.ERRO_REGISTRO_NAO_ENCONTRADO);
			System.out.println(ex);
		}
		return transacaoRetorno;
	}

	public void atualiza(Transacao model) {
		// n�o precisa fazer nada... transacoes n�o podem ser atualizadas..
		
	}
	 
	
	
}
 
